package com.mazj.controller;

import com.mazj.beans.Car;
import com.mazj.beans.Person;
import org.junit.runners.Parameterized;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;

@Controller
@RequestMapping("/user")
/**
 *  spring默认返回的参数都在request中，前台使用requestScope获取，前台默认都是从requestScope获取参数
 *  使用此注解可将当前类所有controller返回参数带person的都在request与session中同时放一份(前台sessionScope与requestScope同时可以获取)
 *  同时可通过type来限制符合条件的参数才往session中存放
 */
@SessionAttributes(value = {"person"},types = String.class)
public class UserController {

    // 方法返回值为String时DispatcherServlet会在视图解析器中寻找与返回名称拼接视图前后缀的jsp，找到后渲染页面
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(){
        System.out.println("进入login..");
        return "login";
    }

    /**
     *  POST请求如果用GET方式请求，会报错405
     * @return
     */
    @RequestMapping(value = "/toLogin", method = RequestMethod.POST)
    public String toLogin(@RequestParam("realname") String username, String password){
        System.out.println("进入toLogin..");
        System.out.println("传入username:" + username + ",password:" + password);
        // 重定向至/user/main
//        return "redirect:main";
        // 转发至main.jsp
        return "main";
    }

    @RequestMapping(value = "/main")
    public String toLogin2(){
        System.out.println("进入main..");
        return "main";
    }


    /**
     * 可使用@RequestParam设置参数的接收名称，使用defaultValue设置参数的默认值，设置默认值必须为String类型，
     * 之后Spring会自动包装为基本类型，注意只有包装类类型才可接收null值。
     * 例如此处如果使用int类型，则会报错400；另外如果接收类型是int或者Integer时，传入字母，也会是400错误。
     *
     * required = false可配置参数为可选参数，默认值为true。
     * 当下面使用int接收参数的同时使用required=true且不给defaultValue时，会报错500，因为spring会将未传值的可选参数转为null值，
     * 而基本类型不能接收null值。
     * @param currentPage
     * @param pageSize
     * @return
     */
    @RequestMapping("/list")
    public String list(@RequestParam(value = "currentPage",defaultValue = "1",required = false) Integer currentPage,
                       @RequestParam(value = "pageSize",defaultValue = "10",required = false) Integer pageSize){
        System.out.println("进入list..");
        System.out.println("currentPage:" + currentPage);
        System.out.println("pageSize:" + pageSize);
        return "user/list";
    }


    /**
     * 路径传参必须配置@PathVariable，否则500
     * springmvc的controller方法不指定method时，默认get/post都支持
     * @param id
     * @return
     */
    @RequestMapping("/get/{id}")
    public String get(@PathVariable(value = "id") Integer id){
        System.out.println("id:" + id);
        return "edit";
    }


    /**
     * 获取浏览器中传入的cookie，示例为获取cookie中默认的JSESSIONID
     * @param sessionId
     * @return
     */
    @RequestMapping("/testcookie")
    public String testCookie(@CookieValue("JSESSIONID") String sessionId){
        System.out.println("sessionId:" + sessionId);
        return "success";
    }

    @RequestMapping("/testheader")
    public String testHeader(@RequestHeader("Accept-Language") String header){
        System.out.println("header:" + header);
        return "success";
    }

    /**
     * 参数表达式，年龄等于10 的请求不接收
     * @param username
     * @param age
     * @return
     */
    @RequestMapping(value = "/testparam", params = {"username","age!=10"})
    public String testParam(String username,Integer age){
        System.out.println("username:" + age);
        return "success";
    }


    @RequestMapping(value = "form")
    public String form(){
        return "user/form";
    }

    /**
     * Spring 自动判断jsp提交的form是多个参数还是pojo，如果是pojo，spring自动封装成java Bean
     * @param person
     * @return
     */
    @RequestMapping(value = "testmodule",method = RequestMethod.POST)
    public String testModule(Person person){
        System.out.println("person:" + person);
        return "success";
    }

    /**
     * Controller返回String类型且不加@ResponseBody时，默认返回为视图，通过视图适配器寻找对应的视图，
     * 如果加了@ResponseBody，会将结果转为json返回
     * ModelAndView 多个重载构造，可返回数据+视图
     *
     * 本处示例使用了jsp el标签，需引入el jar，并在jsp页面引入JSTL标签库
     * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
     * @return
     */
    @RequestMapping("edit")
//    @ResponseBody
    public ModelAndView testModelAndView(){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("user/form");
        Person person = new Person(
                "xiaoming",22,new Car("audi",400000,200)
        );
        mv.addObject("person",person);
        return mv;
    }

    @RequestMapping("edit1")
    public String testMap(Map<String,Object> map){
        Person person = new Person(
                "xiaoming",22,new Car("coco",400000,200)
        );
        map.put("person",person);
        return "user/form";
    }

    @RequestMapping("edit2")
    public String testModel(Model model){
        Person person = new Person(
                "xiaoming",22,new Car("daben",1000000,200)
        );
        model.addAttribute("person",person);
        model.addAttribute("strvalue","gp1701");
        model.addAttribute("intvalue",1701);
        return "user/form";
    }
}
